package com.moweilin.folded_binding;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDRectangle;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * Created by moweilin on 2017/3/8.
 */
public class PDFEditor {
    private PDDocument source;
    private PDRectangle defaultRect;
    private List<Integer> pageList;
    public PDFEditor(PDDocument source) {
        this.source = source;
        if(source.getNumberOfPages() > 0) {
            PDPage page = source.getPage(0);
            defaultRect = page.getCropBox();
        }else {
            defaultRect = PDRectangle.A4;
        }
        pageList= new ArrayList<>();
        for(Integer i = 0; i <source.getNumberOfPages(); i++){
            pageList.add(i);
        }
    }
    public PDFEditor(String file) throws IOException {
        this(PDDocument.load(new File(file)));
    }

    public void insertBlankPage(int index,int count){
//        PDPage nextPage = source.getPage(index);
        for(int i = 0; i < count; i ++) {
            pageList.add(index,-1);
        }
    }
    public void appendBlankPage(int count){
        for(int i = 0; i < count; i ++) {
            pageList.add(-1);
        }
    }
//    public void save(String file) throws IOException {
//        source.save(file);
//    }
    private PDPage buildNewPage(PDRectangle r){
        return new PDPage(r);
    }
    private PDPage buildNewPage(){
        return buildNewPage(defaultRect);
    }
    //    public void add

    public List<PDDocument> split(String ... startLabels) throws IOException {
        List<PDDocument> result = new ArrayList<>();
        Map<String,Integer>  map = source.getDocumentCatalog().getPageLabels().getPageIndicesByLabels();
        Integer contentStart = map.get(startLabels[0]);

        if(contentStart <0){
            throw  new RuntimeException("can not find a start label in the pdf file");
        }
        for (int i = 0; i < startLabels.length; i++) {
            PDDocument pdDocument = new PDDocument();
            for(int j = 0 ; j < contentStart; j ++){
                pdDocument.addPage(source.getPage(j));
            }

            int stIndex = map.get(startLabels[i]);
            int ndIndex = 0;
            if( i < startLabels.length - 1){
                ndIndex = map.get(startLabels[i + 1]);
            }else {
                ndIndex = source.getNumberOfPages();
            }

            for(int k = stIndex; k < ndIndex; k ++){
                pdDocument.addPage(source.getPage(k));
            }
            result.add(pdDocument);
        }
        return result;
    }

    public PDDocument build() {
        PDDocument result = new PDDocument();
        pageList.forEach(page->{
            PDPage pdPage;
            if(page < 0 || page >= source.getNumberOfPages()){
                pdPage = buildNewPage();
            }else {
                pdPage = source.getPage(page);
            }
            result.addPage(pdPage);
        });
        return result;
    }
}
